/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.model;
import java.io.Serializable;
import java.util.ArrayList;

/**
 * Class Polygone
 * 
 * Représentation d'un polygone
 * 
 * @author LEFEVRE Michael
 * @author THOUE Jonathan
 */
public class Polygone extends ElementGeo implements Serializable{
    
     /**
     * Attribut de la classe Polygone
     */
    private ArrayList<Point> listPoint;
    
    /**
     * Constructeur par defaut de Polygone
     */
    public Polygone(){
        listPoint = new ArrayList<Point>();
    }
    /**
     * Surcharge du constructeur de Polygone
     * @param listPoint - ArrayListe des point de polygone 
     */
    public Polygone(ArrayList<Point> listPoint){
        this.listPoint = listPoint;
    }
    /**
     * Creer un clone de Polygone
     * @return clone de Polygone
     */
    @Override
    public Polygone createClone(){
        return new Polygone(listPoint);
    }
    /**
     * Creer la symétrie du Polygone
     * @return symetrie du Polygone
     */
    @Override
    public Polygone createSymetrie(){
        Polygone p  = new Polygone();
        for (Point point : listPoint) {
            p.getListPoint().add(point.createSymetrie());
        }
        return p;
    }
    /**
     * Get la liste de Point du Polygone
     *@return ListPoint - Liste des Point du Polygone 
     */
    public ArrayList<Point> getListPoint() {
        return listPoint;
    }
    /**
     *Set la liste de Point du Polygone
     *@param listPoint 
     */
    public void setListPoint(ArrayList<Point> listPoint) {
        this.listPoint = listPoint;
    }
    /**
     *Override de toString
     *@return les valeurs des Points de la liste
     */
    @Override
        public String toString() {
        return "Polygone{ Liste Point " + this.listPoint + "}";
    }
     /**
     * isPointOver vérifie si un point est contenu dans la forme géométrique
     *@param click - point
     *@param marge - marge d'erreur
     */
    @Override
    public boolean isPointOver(Point click, int marge) {
        boolean result =false;
        if(!listPoint.isEmpty()){ 
            
        Point min = new Point(1000,1000);
        Point max = new Point(0,0);
        
            for (Point point : listPoint) {
                if(point.getX() >max.getX()){
                    max.setX(point.getX());
                }else if(point.getX() <min.getX()){
                    min.setX(point.getX());
                }
                if(point.getY() >max.getY()){
                    max.setY(point.getY());
                }else if(point.getY() <min.getY()){
                    min.setY(point.getY());
                }
            }
            Rectangle rec = new Rectangle(min,max);
            result = rec.isPointOver(click, marge);
        }
        
        return result;
    }
    /**
     * translateTo déplace la forme géométrique
     *@param diffX - déplacement en X
     *@param diffY - déplacement en Y
     */
    @Override
    public void translateTo(int diffX, int diffY) {
        if(!listPoint.isEmpty()){         
            for (Point point : listPoint) {
                point.translateTo(diffX, diffY);
            }
        }
    }
    /**
     * Fait la symetrie par rapport à l'origine
     * @param o - origine
     */
    @Override
    public void symetrieO(Point o){
        if(!listPoint.isEmpty()){         
            for (Point point : listPoint) {
                point.symetrieO(o);
            }
        }
    }
    /**
     * Fait la symetrie par rapport à X
     * @param o - origine
     */
    @Override
    public void symetrieX(Point o){
        if(!listPoint.isEmpty()){         
            for (Point point : listPoint) {
                point.symetrieX(o);
            }
        }
    }
    /**
     * Fait la symetrie par rapport à Y
     * @param o - origine
     */
    @Override
    public void symetrieY(Point o){
        if(!listPoint.isEmpty()){         
            for (Point point : listPoint) {
                point.symetrieY(o);
            }
        }
    }  
}
